#pragma once

struct VTShape;
// 虚函数表，编译器生成的
struct VTableShape
{
	void (*Print)(VTShape* pThis); //指向Print函数的指针
	// 若有多个虚函数，则此表会有多项
	// 纯虚函数在此表中填写一个空指针或者一个编译器生成的错误提示函数
};

// 包含虚函数表的基础数据结构
struct VTShape
{
	VTableShape* vtable;
};
void VTShapePrint(VTShape* pThis); //调用虚函数Print

// Triangle的数据结构
struct Triangle_t
{
	VTableShape* vtable; //编译器插入的成员变量
	int id;
};

/* 逻辑上编译器创建的数据结构是这样的，物理上与上面的内存结构是一样的
struct Triangle_t
{
	VTShape insertedHeader; //编译器插入的成员变量
	int id;
};
*/

void ConstructTriangle(Triangle_t* pThis, int id); //Triangle的构造函数

// Circle的数据结构
struct Circle_t
{
	VTableShape* vtable; //编译器插入的成员变量
};

void ConstructCircle(Circle_t* pThis); //Circle的构造函数
